package co.inventario.datos.sqlserver;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import co.inventario.entidad.ConceptoKardexDTO;
import co.inventario.entidad.KardexDTO;
import co.inventario.entidad.InsumoDTO;

public class KardexDAOSQLServer {

	private String crearSQL;
	private String actualizarSQL;
	private String consultarSQL;

	public KardexDAOSQLServer() {
		crearSQL = "";
		actualizarSQL = "";
		consultarSQL = "";
	}

	public void crear(KardexDTO kardexDTO, Connection connection) throws SQLException {
		crearSQL = "INSERT INTO Kardex (Nv_Consecutivo_Kardex, In_Codigo_Insumo, Da_FechaMovimiento_Kardex, In_Codigo_Concepto, Dc_Cantidad_Kardex, Mn_Costo_Kardex) VALUE (?, ?, ?, ?, ?, ?)";
		try (PreparedStatement preparedStatement = connection.prepareStatement(crearSQL)) {
			preparedStatement.setInt(1, kardexDTO.getInConsecutivoKardex());
			preparedStatement.setInt(2, kardexDTO.getInsumoDTO().getInCodigoInsumo());
			preparedStatement.setString(3, kardexDTO.getDaFechaMovimientoKardex());
			preparedStatement.setInt(4, kardexDTO.getConceptoKardexDTO().getInCodigoConcepto());
			preparedStatement.setDouble(5, kardexDTO.getDcCantidadKardex());
			preparedStatement.setDouble(6, kardexDTO.getMnCostoKardex());
			preparedStatement.executeUpdate();
		} catch (SQLException exception) {
			System.err.println("Se ha presentado un problema creando el kardex: " + exception.getMessage());
		}
	}

	public void actualizar(KardexDTO kardexDTO, Connection connection) throws SQLException {
		actualizarSQL = "UPDATE Kardex SET Nv_Consecutivo_Kardex = ISNULL(?, Nv_Consecutivo_Kardex), In_Codigo_Insumo = ISNULL(?, In_Codigo_Insumo), Da_FechaMovimiento_Kardex = ISNULL(?, Da_FechaMovimiento_Kardex), In_Codigo_Concepto = ISNULL (?, In_Codigo_Concepto), Dc_Cantidad_Kardex = ISNULL(?, Dc_Cantidad_Kardex), Mn_Costo_Kardex = ISNULL(?, Mn_Costo_Kardex) WHERE In_Codigo_Kardex = ?";
		try (PreparedStatement preparedStatement = connection.prepareStatement(actualizarSQL)) {
			preparedStatement.setInt(1, kardexDTO.getInConsecutivoKardex());
			preparedStatement.setInt(2, kardexDTO.getInsumoDTO().getInCodigoInsumo());
			preparedStatement.setString(3, kardexDTO.getDaFechaMovimientoKardex());
			preparedStatement.setInt(4, kardexDTO.getConceptoKardexDTO().getInCodigoConcepto());
			preparedStatement.setDouble(5, kardexDTO.getDcCantidadKardex());
			preparedStatement.setDouble(6, kardexDTO.getMnCostoKardex());
			preparedStatement.setInt(7, kardexDTO.getInCodigoKardex());
			preparedStatement.executeUpdate();
		} catch (SQLException exception) {
			System.err.println("Se ha presentado un problema actualizando el kardex: " + exception.getMessage());
		}
	}

	public KardexDTO consultarPorCodigo(KardexDTO kardexDTO, Connection connection) throws SQLException {
		consultarSQL = "SELECT * FROM Kardex WHERE In_Codigo_Kardex = ?";
		KardexDTO kardexDTOResultado = null;
		InsumoDTO insumoDTO = null;
		ConceptoKardexDTO conceptoKardexDTO = null;
		try (PreparedStatement preparedStatement = connection.prepareStatement(consultarSQL)) {
			preparedStatement.setInt(1, kardexDTO.getInCodigoKardex());
			try (ResultSet resultSet = preparedStatement.executeQuery()) {
				kardexDTOResultado = new KardexDTO();
				kardexDTOResultado.setInCodigoKardex(resultSet.getInt("In_Codigo_Kardex"));
				kardexDTOResultado.setInConsecutivoKardex(resultSet.getInt("Nv_Consecutivo_Kardex"));
				insumoDTO = new InsumoDTO();
				insumoDTO.setInCodigoInsumo(resultSet.getInt("In_Codigo_Insumo"));
				kardexDTOResultado.setInsumoDTO(insumoDTO);
				kardexDTOResultado.setDaFechaMovimientoKardex(resultSet.getString("Da_FechaMovimiento_Kardex"));
				conceptoKardexDTO = new ConceptoKardexDTO();
				conceptoKardexDTO.setInCodigoConcepto(resultSet.getInt("In_Codigo_Concepto"));
				kardexDTOResultado.setConceptoKardexDTO(conceptoKardexDTO);
				kardexDTOResultado.setDcCantidadKardex(resultSet.getDouble("Dc_Cantidad_Kardex"));
				kardexDTOResultado.setMnCostoKardex(resultSet.getDouble("Mn_Costo_Kardex"));
			}
		} catch (SQLException exception) {
			System.err.println("Se ha presentado un problema consultando el kardex a traves del codigo: " + exception.getMessage());
		}
		return kardexDTOResultado;
	}
	
	public KardexDTO consultarPorConsecutivo(KardexDTO kardexDTO, Connection connection) throws SQLException {
		consultarSQL = "SELECT * FROM Kardex WHERE Nv_Consecutivo_Kardex = ?";
		KardexDTO kardexDTOResultado = null;
		InsumoDTO insumoDTO = null;
		ConceptoKardexDTO conceptoKardexDTO = null;
		try (PreparedStatement preparedStatement = connection.prepareStatement(consultarSQL)) {
			preparedStatement.setInt(1, kardexDTO.getInConsecutivoKardex());
			try (ResultSet resultSet = preparedStatement.executeQuery()) {
				kardexDTOResultado = new KardexDTO();
				kardexDTOResultado.setInCodigoKardex(resultSet.getInt("In_Codigo_Kardex"));
				kardexDTOResultado.setInConsecutivoKardex(resultSet.getInt("Nv_Consecutivo_Kardex"));
				insumoDTO = new InsumoDTO();
				insumoDTO.setInCodigoInsumo(resultSet.getInt("In_Codigo_Insumo"));
				kardexDTOResultado.setInsumoDTO(insumoDTO);
				kardexDTOResultado.setDaFechaMovimientoKardex(resultSet.getString("Da_FechaMovimiento_Kardex"));
				conceptoKardexDTO = new ConceptoKardexDTO();
				conceptoKardexDTO.setInCodigoConcepto(resultSet.getInt("In_Codigo_Concepto"));
				kardexDTOResultado.setConceptoKardexDTO(conceptoKardexDTO);
				kardexDTOResultado.setDcCantidadKardex(resultSet.getDouble("Dc_Cantidad_Kardex"));
				kardexDTOResultado.setMnCostoKardex(resultSet.getDouble("Mn_Costo_Kardex"));
			}
		} catch (SQLException exception) {
			System.err.println("Se ha presentado un problema consultando el kardex a traves del consecutivo: " + exception.getMessage());
		}
		return kardexDTOResultado;
	}

	public ArrayList<KardexDTO> consultarTodo(Connection connection) throws SQLException {
		consultarSQL = "SELECT * FROM Kardex";
		KardexDTO kardexDTOResultado = null;
		ArrayList<KardexDTO> kardexDTOLista = null;
		InsumoDTO insumoDTO = null;
		ConceptoKardexDTO conceptoKardexDTO = null;
		try (PreparedStatement preparedStatement = connection.prepareStatement(consultarSQL)) {
			try (ResultSet resultSet = preparedStatement.executeQuery()) {
				kardexDTOResultado = new KardexDTO();
				kardexDTOResultado.setInCodigoKardex(resultSet.getInt("In_Codigo_Kardex"));
				kardexDTOResultado.setInConsecutivoKardex(resultSet.getInt("Nv_Consecutivo_Kardex"));
				insumoDTO = new InsumoDTO();
				insumoDTO.setInCodigoInsumo(resultSet.getInt("In_Codigo_Insumo"));
				kardexDTOResultado.setInsumoDTO(insumoDTO);
				kardexDTOResultado.setDaFechaMovimientoKardex(resultSet.getString("Da_FechaMovimiento_Kardex"));
				conceptoKardexDTO = new ConceptoKardexDTO();
				conceptoKardexDTO.setInCodigoConcepto(resultSet.getInt("In_Codigo_Concepto"));
				kardexDTOResultado.setConceptoKardexDTO(conceptoKardexDTO);
				kardexDTOResultado.setDcCantidadKardex(resultSet.getDouble("Dc_Cantidad_Kardex"));
				kardexDTOResultado.setMnCostoKardex(resultSet.getDouble("Mn_Costo_Kardex"));
			}
		} catch (SQLException exception) {
			System.err.println("Se ha presentado un problema consultando todo el kardex: " + exception.getMessage());
		}
		return kardexDTOLista;
	}
}
